/**声音工厂类
 * 参数是声音的url地址
 * SoundFactory.alone(url)
 * SoundFactory.array([url1,url2,url3])
 * 
 * audio在音乐播放上用的频率极高，后来自己就查阅资料和度娘来总结了一下audio的JS事件：
play:音频或视频文件已经就绪可以开始播放时触发
playing:音频或视频已开始播放时触发
ended:音频或视频文件播放完毕后触发
pause:音频或视频文件暂停时触发
ratechange:播放速度改变进触发
seeked:指示定位已结束时触发
seeking:正在进行指示定位时触发
timeupdate:播放位置改变时触发
volumechange:音量改变时触发
waiting:需要缓冲下一帧而停止时触发
loadstart:浏览器开始寻找指定的音频或视频
progress:浏览器正在下载指定的音频或视频
durationchange:音频或视频的时长已改变
loadedmetadata:音频或视频的元数据已加载
loadeddata:音频或视频的当前帧已加载，但没有足够数据播放下一帧
canplay:浏览器能够开始播放指定的音频或视频
canplaythrough:音频或视频能够不停顿地一直播放
progress:浏览器正在下载指定的音频或视频
abort:在音频或视频终止加载时触发
error:在音频或视频加载发生错误时触发
stalled:在浏览器尝试获取媒体数据，但数据不可用时触发
suspend:在音频或视频数据被阻止加载时触发
empted:在发生故障并且文件突然不可用时触发
play:音频或视频文件已经就绪可以开始播放时触发
playing:音频或视频已开始播放时触发
ended:音频或视频文件播放完毕后触发
pause:音频或视频文件暂停时触发
ratechange:播放速度改变进触发
seeked:指示定位已结束时触发
seeking:正在进行指示定位时触发
timeupdate:播放位置改变时触发
volumechange:音量改变时触发
waiting:需要缓冲下一帧而停止时触发
 * author:ywx620
 * web:https://ywx620.gitee.io/learn/
*/
const SoundFactory=function (exports) {
	const content={};
	function alone(url,callBack){
		if(!this.one){
			console.log('只初始一次')
			this.one=new MSound();
		}
		this.one.setUrl(url);
		this.one.play();
		this.one.onComplete=()=>{
			callBack&&callBack();
		}
		return this.one;
	}
	function array(arr,callBack){
		let i=0;
		function play(){
			if(i<arr.length){
				let one=alone(arr[i++]);
				one.onComplete=()=>{
					play();
				}
			}else{
				callBack&&callBack();
			}
		}
		play();
	}
	function only(url,callBack){
		let one=new MSound();
		one.setUrl(url);
		one.play();
		one.onComplete=()=>{
			callBack&&callBack();
			one.dispose();
			one=null;
		}
	}
	function loop(url){
		let one=create(url,url);
		one.play();
		one.audio.loop=true;
	}
	/**创建声音产品*/
	function create(name,url){
		if(!content[name]){
			content[name]=new MSound();
		}
		let sound=content[name];
		if(url) sound.setUrl(url);
		return sound;
	}
	/**找到声音产品然后销毁掉*/
    const remove = (name) => {
        var sound = content[name];
        if (sound) {
            sound.dispose();
            delete content[sound.name];
        }
        return null;
    }
    /**得到已经存在的声音产品*/
    const getContent = (name) => {
        var sound = content[name];
        if (sound) return sound;
        return null;
    }
	class MSound{
		constructor() {
			let audio = document.createElement('audio');
			audio.hidden="true";
			audio.autoplay='true';
			document.body.appendChild(audio);
			this.audio=audio;
			//audio监听事件 play：音频播放,pause：音频暂停,ended：音频播放结束,timeupdate：音频播放时间更新,volumechange：音量改变
			//progress:浏览器正在下载指定的音频或视频
			this.audio.addEventListener('ended', ()=>{//音频播放结束
				if(this.onComplete) this.onComplete();
			});
		}
		play(url){	
			if(url) this.setUrl(url);			
			this.audio.play();		
		}
		pause(){			this.audio.pause();		}
		setVolume(value){	this.audio.volume=value;}
		getVolume(){return 	this.audio.volume;		}
		setUrl(url){		this.audio.src=url;		}
		getUrl(){ 	return 	this.audio.src;			}
		setTime(value){		this.audio.currentTime=value}
		getTime(){	return 	this.audio.currentTime}
		dispose(){document.body.removeChild(this.audio);}
	}
	exports.alone = alone;//独立播发
	exports.only = only;//独立播发一次就销毁
	exports.loop = loop;//循环播发
	exports.array = array;//独立播发数组
	exports.create = create;//创建声音
	exports.getContent = getContent;//得到声音
	exports.remove = remove;//删除声音
    Object.defineProperty(exports, "__esModule", {
        value: true
    });
    return exports
}
({});